<?php
class Session {
	private static $cfg = array();
	/**
	* 启动session
	*/
	public static function start($cfg = array()) {
		self::setCfg($cfg);
		//初始化session设置
		//开启session.use_trans_sid对搜索引擎优化影响很大，搜索引擎不会发送cookie，所以每次抓取的时候都看到新的链接
		@ini_set('session.use_trans_sid', 0);
		@ini_set('session.use_cookies', 1);
		@ini_set('session.use_only_cookies', 1);
		@ini_set('session.bug_compat_42', 0);
		@ini_set('session.bug_compat_warn', 1);
		
		session_cache_limiter(self::$cfg['cache_limiter']);
		session_cache_expire(self::$cfg['cache_expire']);
		
		if(self::$cfg['name'] != 'Default') {
			session_name(self::$cfg['name']);
		}
		
		//如使用swfupload时（或其他的需要开启独立进程的浏览器插件），则传递$_POST['session_id']=SESSION_ID。
		if (isset($_POST['session_id'])) {
			session_id($_POST['session_id']);
		}
		
		if(self::is_php('5.2.0')) {
			//httponly自5.2.0有效。
			session_set_cookie_params(self::$cfg['cookie_lifetime'], self::$cfg['cookie_path'], self::$cfg['cookie_domain'], self::$cfg['cookie_secure'], self::$cfg['cookie_httponly']);
		} else {
			session_set_cookie_params(self::$cfg['cookie_lifetime'], self::$cfg['cookie_path'], self::$cfg['cookie_domain'], self::$cfg['cookie_secure']);
		}
		
		//设置session处理器
		if(self::$cfg['handler'] != 'Default' && class_exists('Session' . self::$cfg['handler'], FALSE)) {
			$handler_class = 'Session' . self::$cfg['handler'];
			
			$handler = new $handler_class(self::$cfg);
			
			session_set_save_handler(array($handler, 'open'), array($handler, 'close'), array($handler, 'read'), array($handler, 'write'), array($handler, 'destroy'), array($handler, 'gc'));
		} else {
			@ini_set('session.save_handler', 'files');
			if(self::$cfg['default_filepath'] != '' && file_exists(self::$cfg['default_filepath'])) {
				session_save_path(self::$cfg['default_filepath']);
			}
		}
		
		if(ini_get('session.auto_start') == 0) {
			session_start();
		}
	}
	
	/**
	* 关闭当前session，保存session数据
	*/
	public static function end() {
		session_write_close();
	}
	
	/**
	* 清除session
	*/
	public static function clear() {
		$_SESSION = array(); //清除session变量
		if (isset($_COOKIE[session_name()])) { //清除session的cookie
			setcookie(session_name(), '', time()-42000, '/');
		}
		session_destroy(); //销毁session
	}
	
	/**
	* 获取设置session的通用方法
	*/
	public static function sess() {
		$num = func_num_args();
		$args = func_get_args();
		$key = $args[0];
		if($num === 1) {
			//如果只有一个参数，则获取session
			return $_SESSION[$key];
		} else {
			$val = $args[1];
			if($val === NULL) {
				//如果第二个参数是null，则销毁session
				unset($_SESSION[$key]);
			} else {
				if(is_object($val)) {
					$val = serialize($val);
				}
				//如果第二个参数不是null，则设置session
				$_SESSION[$key] = $val;
			}
		}
	}
	
	/**
	* 判断php版本
	*/
	private static function is_php($version = '5.0.0') {
		static $_is_php;
		$version = (string) $version;
		if(!isset($_is_php[$version])) {
			$_is_php[$version] = version_compare(PHP_VERSION, $version) < 0 ? FALSE : TRUE;
		}
		
		return $_is_php[$version];
	}
	
	/**
	 * 设置配置
	 */
	private static function setCfg($cfg) {
		self::$cfg = require FRAMEWORK_SESSION_ROOT . 'config.php'; 
		foreach($cfg as $k => $v) {
			if(array_key_exists($k, self::$cfg)) self::$cfg[$k] = $v;
		}
	}
}
?>